package com.t.bricks.bussiness.service.loginuser.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.t.bricks.bussiness.db.dao.loginuser.LoginUserDao;
import com.t.bricks.bussiness.db.entity.loginuser.LoginUser;
import com.t.bricks.bussiness.db.entity.loginuser.base.LoginUserBase;
import com.t.bricks.bussiness.service.loginuser.LoginUserService;
import com.t.bricks.model.MsgEmity;
import com.t.bricks.utils.function.encode.MD5Util;
import com.t.bricks.utils.spring.ModuleUtil;

/**
 * 用户表'LoginUser表'基本业务操作类接口实现
 */
@Service
public class LoginUserServiceImpl implements LoginUserService<LoginUser> {

	@Autowired
	private LoginUserDao<LoginUser> loginUserDao;
	
	/**
	 * MD5加密干扰串
	 */
	@Value("${app.md5.key:未设置app.md5.key配置项}")
	private String appMd5Key;

	/**
	 * 新增
	 * @param loginUser 用户表 对象实体,注意:跨包访问时可能会是json字符串
	 * @return
	 */
	@Override
	public MsgEmity add(Object loginUser) {
		MsgEmity me = ModuleUtil.objToEntity(loginUser, LoginUser.class);//转换数据,因为如果传递的是String,则可能是进行了跨包访问,要先用Json转换成实体对象
		if (!me.isSuccess()) {
			return me;
		}
		
		LoginUser loginUserData = me.getData();
		String sNo = loginUserData.getsNo();
		if (null == sNo || "".equals(sNo.trim()) ) {
			return MsgEmity.err(8401, "工号作为唯一标识不能为空!");//在同一根部门下,工号必须唯一
		}
		
		me = ModuleUtil.validDbEntityByAdd(loginUserData);// 通用的基本数据验证,如果要进行比较复杂的数据验证则可以屏蔽掉此方法自行编写
		if (!me.isSuccess()) {
			return me;
		}
		
		me = ModuleUtil.validDbEntityRepeatByAdd((LoginUserBase)loginUserData, loginUserDao);//查询数据库,验证数据是否有重复,因验证数据重复的方式比较复杂,直接在sql脚本中处理
		if (!me.isSuccess()) {// 在false下,如果返回8028则表示数据库查询异常,否则返回后4位是8026的数据,如xxx8026,从万位起表示从数据库中查询的结果
			String tmp = me.getData().toString();
			tmp = tmp.substring(tmp.length() -4, tmp.length());// 数据一定不小于4位
			return me.setData(tmp);// 发现重复数据后不进行其它业务处理则退出时,必须清理返回数据
		}
		
		loginUserData.setuId(null);//清空记录编号
		
		me = ModuleUtil.supplyDbEntityAttrByAdd(loginUserData);// 补充数据,如添加id、当前用户、当前时间等
		if (!me.isSuccess()) {
			return me;
		}

		//--提交数据保存--//
		return loginUserDao.add(loginUserData);
	}

	/**
	 * 删除
	 * @param iVersion 数据版本号
	 * @param uId 表编号
	 * @return
	 */
	@Override
	public MsgEmity del(Integer iVersion, String uId) {
		if (null == uId || "".equals(uId.trim())) {
			return new MsgEmity(false, "信息编号参数错误，请刷新重试！", 8001);
		}
		
		if (null == iVersion || iVersion.intValue() < 1) {
			return new MsgEmity(false, "信息版本参数错误，其值应大于0！", 8002);
		}
		
		if (",00000000,00000001,".contains(uId)) {
			return new MsgEmity(false, "特殊用户，禁止删除！", 8003);
		}

		return loginUserDao.del(uId, iVersion);
	}

	/**
	 * 修改
	 * @param loginUser 用户表 对象实体,注意:跨包访问时可能会是json字符串
	 * @return
	 */
	@Override
	public MsgEmity edit(Object loginUser) {
		MsgEmity me = ModuleUtil.objToEntity(loginUser, LoginUser.class);//转换数据,因为如果传递的是String,则可能是进行了跨包访问,要先用Json转换成实体对象
		if (!me.isSuccess()) {
			return me;
		}
		
		LoginUser loginUserData = me.getData();
		
		me = ModuleUtil.validBaseDataByEdit(loginUserData);// 通用的基本数据验证(编辑),如果要进行比较复杂的数据验证则可以屏蔽掉此方法自行编写
		if (!me.isSuccess()) {
			return me;
		}
		
		me = ModuleUtil.validDbEntityRepeatByEdit((LoginUserBase)loginUserData, loginUserDao);// 查询数据库,验证数据是否有重复,因验证数据重复的方式比较复杂,直接在sql脚本中处理
		if (!me.isSuccess()) {// 在false下,如果返回8028则表示数据库查询异常,否则返回后4位是8026的数据,如xxx8026,从万位起表示从数据库中查询的结果
			String tmp = me.getData().toString();
			tmp = tmp.substring(tmp.length() -4, tmp.length());//数据一定不小于4位
			return me.setData(tmp);// 发现重复数据后不进行其它业务处理则退出时,必须清理返回数据
		}
		
		ModuleUtil.supplyDbEntityAttrByEdit(loginUserData);// 补充数据
		
		//--提交数据保存--//
		return loginUserDao.edit(loginUserData);//注意:更新成功后对象属性iVersion值将被+1
	}
	
	/**
	 * 修改密码
	 * @param uId
	 * @param sOldPass
	 * @param sNewPass
	 * @return
	 */
	@Override
	public MsgEmity editPass(String uId, String sOldPass, String sNewPass) {
		if (null == uId || "".equals(uId.trim())) {
			return new MsgEmity(false, "用户uId不能为空！", 8001);
		}
		
		if (null == sOldPass || "".equals(sOldPass.trim())) {
			return new MsgEmity(false, "旧密码不能为空！", 8002);
		}
		
		if (null == sNewPass || "".equals(sNewPass.trim())) {
			return new MsgEmity(false, "新密码不能为空！", 8003);
		}

		LoginUser loginUserData = new LoginUser();
		loginUserData.setuId(uId);
		MsgEmity me = loginUserDao.findCountByKey(loginUserData, false);
		if (!me.isSuccess()) {
			return new MsgEmity(false, "没有查找到用户！", 8004);
		}
		
		me = loginUserDao.findById(uId, false);
		if (!me.isSuccess() || null == me.getData()) {
			return new MsgEmity(false, "没有查找到对应用户！", 8005);
		}
		
		LoginUser loginUser = me.getData();
		
		if (loginUser.getiState() != 1) {
			return new MsgEmity(false, "用户被限制！", 8006);
		}
		
		String sOldPassMd5 = MD5Util.md5(sOldPass, appMd5Key);
		if (!sOldPassMd5.equals(loginUser.getsPass()) ) {
			return new MsgEmity(false, "提供的旧密码错误！", 8007);
		}
		
		String sNewPassMd5 = MD5Util.md5(sNewPass, appMd5Key);
		if (sNewPassMd5.equals(sOldPassMd5)) {
			return MsgEmity.success(8999, "密码无需修改！");
		}
		
		return loginUserDao.editPass(uId,
				sOldPassMd5,
				sNewPassMd5,
				loginUser.getiVersion(),
				ModuleUtil.currentLoginUserId(),
				loginUser.getsOwner());
	}
	
	/**
	 * 重置密码
	 * @param uId 被修改的用户编号
	 * @param sPass 操作人员的密码
	 * @return
	 */
	@Override
	public MsgEmity resetPass(String uId, String sPass) {
		if (null == uId || "".equals(uId.trim())) {
			return new MsgEmity(false, "用户编号不能为空！", 8001);
		}
		
		uId = uId.trim();
		
		String currentLoginUserId = ModuleUtil.currentLoginUserId();
		if (null == currentLoginUserId || "".equals(currentLoginUserId.trim())) {
			return new MsgEmity(false, "未能获取操作人员信息！", 8002);
		}

		if (!"/00000000/00000001/".contains(currentLoginUserId) && !uId.equals(currentLoginUserId)) {//超级管理员登录/管理员或当前用户
			return new MsgEmity(false, "仅允许管理员或当前用户重置密码", 8003);
		}
		
		MsgEmity me = loginUserDao.findById(currentLoginUserId, false);
		if (!me.isSuccess() || null == me.getData()) {
			return new MsgEmity(false, "当前操作用户信息错误,请联系管理员！", 8004);
		}
		
		LoginUser loginUserModifieder = me.getData();

		String sModifiederPass = MD5Util.md5(sPass, appMd5Key);
		if (!(sModifiederPass.equals(loginUserModifieder.getsPass()))) {
			return new MsgEmity(false, "提供的操作用户密码错误!", 8005);
		}
		
		me = loginUserDao.findById(uId, false);
		if (!me.isSuccess() || null == me.getData()) {
			return new MsgEmity(false, "没有查找到待重置密码的用户！", 8006);
		}
		
		LoginUser loginUser = me.getData();

		String sOldPass = loginUser.getsPass();
		String sNewPass = MD5Util.md5("123456", appMd5Key);
		if (sOldPass.equals(sNewPass)) {
			return MsgEmity.success(8999, "密码无需修改重置！");
		}
		
		return loginUserDao.editPass(uId,
				sOldPass,
				sNewPass,
				loginUser.getiVersion(),
				currentLoginUserId,
				loginUser.getsOwner());
	}
	
	/**
	 * 根据用户编号设置用户类型
	 * @param uId 用户编号
	 * @param sType 用户类型
	 * @return
	 */
	@Override
	public MsgEmity editUserType(String uId, Integer sType) {
		if (null == uId || "".equals(uId)) {
			return new MsgEmity(false, "用户编号不能为空！", 8001);
		}
		
		if (null == sType || "".equals(sType)) {
			return new MsgEmity(false, "用户类型不能为空！", 8002);
		}
		
		return loginUserDao.editUserType(uId, sType);
	}
	
}
